package br.senai.sc.controller.business;

import java.math.BigDecimal;
import java.math.RoundingMode;

import br.senai.sc.controller.exception.BusinessException;
import br.senai.sc.model.Amostra;

/**
 * Utilizada para calculos de IQA de uma amostra.
 * 
 * @author Tiago
 */
public final class IQABusiness {

	public static final RoundingMode ROUND_MODE = RoundingMode.HALF_DOWN;

	private IQABusiness() {

	}

	/**
	 * Calcula o IQA da amostra informada. O cálculo do IQA é a multiplipação de
	 * todos os seus parâmetros.
	 * 
	 * @param amostra
	 * @return
	 * @throws BusinessException
	 */
	public static BigDecimal calculaIQA(Amostra amostra)
			throws BusinessException {

		// caso a amostra nao tenha sido informada
		if (amostra == null) {
			throw new BusinessException();
		}

		BigDecimal mediaColiformes = CalculoColiformesBusiness
				.mediaQualidade(amostra.getColiformesFecais());
		BigDecimal mediaDBO = CalculoDBOBusiness.mediaQualidade(amostra
				.getDbo());
		BigDecimal mediaDiferencaTempo = CalculoDiferencaTemperaturaBusiness
				.mediaQualidade(amostra.getTemperatura());
		BigDecimal mediaFosforos = CalculoFosforoBusiness
				.mediaQualidade(amostra.getPt());
		BigDecimal mediaNitrogeneo = CalculoNitrogenioBusiness
				.mediaQualidade(amostra.getNt());
		BigDecimal mediaOD = CalculoODBusiness.mediaQualidade(amostra);
		BigDecimal mediaPh = CalculoPhBusiness.mediaQualidade(amostra.getPh());
		BigDecimal mediaSolidos = CalculoSolidosBusiness.mediaQualidade(amostra
				.getSt());
		BigDecimal mediaTurbidez = CalculoTurbidezBusiness
				.mediaQualidade(amostra.getTurbidez());

		BigDecimal iqa = mediaColiformes.multiply(mediaDBO)
				.multiply(mediaDiferencaTempo).multiply(mediaFosforos)
				.multiply(mediaNitrogeneo).multiply(mediaOD).multiply(mediaPh)
				.multiply(mediaSolidos).multiply(mediaTurbidez);

		return iqa;
	}

}
